home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
021-030
/
amok29
/
disktohard
/
disktohard.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
4KB
|
120 lines
(**********************************************************************
:Program. DiskToHard.mod
:Contents. copies an entire disk to a file on a harddisk
:Author. Nicolas Benezan [bne]
:Author. Norbert Klapczynski
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga AMSoft V3.2
:Imports. ErrorReq1.3 (on Amok#25:M2Make1.9/Modules)
:Imports. ExDos1.1 (on Amok#25:M2Make1.9/Modules)
:Imports. MemSystem1.4 (on Amok#25:M2Make1.9/Modules)
:Imports. TrackDiskSupport2.1 (on Amok#19:TrackDiskSupport_2.1)
:Imports. StringOps (on this disk :Strings)
:History. V1.0 Norbert, [bne] 15.Aug.1989
:History. V1.1 [bne] 1.Dez.1989 (cosmetics)
**********************************************************************)
MODULE DiskToHard;
FROM Arts IMPORT TermProcedure;
FROM Dos IMPORT Close, Delay, FileHandlePtr, newFile, Open,
Write;
FROM ErrorReq IMPORT Assert;
FROM ExDos IMPORT Examine, FileInfoBlock, FileLockPtr, Lock,
sharedLock, UnLock;
FROM Icon IMPORT FreeDiskObject, GetDiskObject, PutDiskObject;
FROM MemSystem IMPORT Deallocate, NoCareAllocMem;
FROM StringOps IMPORT Assign, Concat;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM TrackDiskSupport IMPORT ChangeState, CloseDiskDevice, DeviceInfo,
DiskUnit, GetDeviceInfo, GetDiskChange,
InhibitDrive, OpenDiskDevice, ReadBlock;
FROM Workbench IMPORT DiskObjectPtr, noIconPosition, WBObjectType;
VAR
Unit: DiskUnit;
File: FileHandlePtr;
Info: DeviceInfo;
Block: INTEGER;
BlocksPerTrack: INTEGER;
Change: LONGINT;
Buffer: ADDRESS;
DiskName: ARRAY [0..30] OF CHAR;
Busy: BOOLEAN;
PROCEDURE Cleanup;
BEGIN
IF File#NIL THEN
Close(File);
END;
IF Busy AND InhibitDrive(Unit, FALSE) THEN END;
END Cleanup;
PROCEDURE GetDiskName (VAR Name: ARRAY OF CHAR);
VAR
DiskLock: FileLockPtr;
DiskInfo: FileInfoBlock;
BEGIN
DiskLock:= Lock("DF0:", sharedLock);
Assert ((DiskLock # NIL) AND Examine (DiskLock, DiskInfo),
ADR ("Disk unlesbar"));
Assign (DiskInfo.fileName, Name);
UnLock (DiskLock);
END GetDiskName;
PROCEDURE CopyIcon (Name: ARRAY OF CHAR);
VAR
Icon: DiskObjectPtr;
BEGIN
Icon:= GetDiskObject (ADR ("DF0:Disk"));
IF Icon= NIL THEN
Icon:= GetDiskObject (ADR ("Disk")); (* default icon *)
END;
Assert (Icon # NIL, ADR ("Icon nicht gefunden"));
WITH Icon^ DO
defaultTool:= ADR ("/HardToDisk");
type:= project;
currentX:= noIconPosition;
currentY:= noIconPosition;
END;
IF PutDiskObject (ADR (Name), Icon) = 0 THEN END;
FreeDiskObject (Icon);
END CopyIcon;
BEGIN
File:= NIL;
Busy:= FALSE;
IF (OpenDiskDevice ("DF0", Unit) = 0) AND ChangeState (Unit) THEN
GetDiskName (DiskName);
TermProcedure (Cleanup);
Assert (InhibitDrive (Unit, TRUE), ADR ("Drive nicht verfügbar"));
Busy:= TRUE;
Change:= GetDiskChange (Unit);
GetDeviceInfo (Unit, Info);
WITH Info DO
NoCareAllocMem (Buffer, trackLen, TRUE);
Concat ("Disks/", DiskName, DiskName);
File:= Open (ADR (DiskName), newFile);
IF File # NIL THEN
BlocksPerTrack:= trackLen DIV blockLen;
Block:= 0;
REPEAT
Assert (ReadBlock (Unit, Block, BlocksPerTrack, Buffer, Change)
= 0, ADR ("Lesefehler"));
Assert (Write (File, Buffer, trackLen) = trackLen,
ADR("Schreibfehler"));
INC (Block, BlocksPerTrack);
UNTIL Block >= numBlocks;
Busy:= NOT InhibitDrive (Unit, FALSE);
Delay (100); (* let file system time to validate the disk *)
CopyIcon (DiskName);(* without delay, this causes a requester: *)
(* no disk present in drive 0 *)
END;
END;
END;
END DiskToHard.